package com.zhisheng.day10_tlias.inteceptor;

import com.alibaba.fastjson.JSONObject;
import com.zhisheng.day10_tlias.entry.R;
import com.zhisheng.day10_tlias.utils.MyJwtUtils;
import com.zhisheng.day10_tlias.utils.MyThreadLocaUtils;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.Map;

/*
    自定义的拦截器,针对用户登陆的权限校验
 */
@Component
public class MyLoginInteceptor implements HandlerInterceptor {

    @Resource(name = "myJwtUtils")
    private MyJwtUtils jwtUtils;

    // 重写一个是否放行的方法
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 当这个方法返回true的时候,是放行,返回false就是不放行
        /*String uri = request.getRequestURI();
        if("/login".equals(uri)){
            return true; // 直接放行
        }
        // 在配置拦截路径的时候,可以直接将  /login排除
        */
        String jwt = request.getHeader("token");
        // 解析它
        Map<String, Object> map = jwtUtils.parseToken(jwt);
        if(map == null){
            // 说明令牌无效或没有令牌,阻止访问
            response.setContentType("application/json;charset=utf-8"); // 固定写法
            // 利用阿里的工具类将统一结果对象,转成json并响应
            R<Object> fail = R.fail("NOT_LOGIN");
            String jsonString = JSONObject.toJSONString(fail);
            response.getWriter().println(jsonString);
            return false;
        }
        // 说明登陆过了,放行
        // 存入ThreadLocal中,以便于后面在任意层获取用户名
        MyThreadLocaUtils.set(map.get("id"));
        return true;
    }

}
